case 3: return x86_seg_ds;
case 4: return x86_seg_fs;
case 5: return x86_seg_gs;
- default: break;
}
return decode_segment_failed;
}
return X86EMUL_UNHANDLEABLE;
}
+static void internal_error(const char *which, uint8_t byte,
+ const struct cpu_user_regs *regs)
+{
+#ifdef __XEN__
+ static bool_t logged;
+
+ if ( !test_and_set_bool(logged) )
+ gprintk(XENLOG_ERR, "Internal error: %s/%02x [%04x:%08lx]\n",
+ which, byte, regs->cs, regs->eip);
+#endif
+ ASSERT_UNREACHABLE();
+}
+
int
x86_emulate(
struct x86_emulate_ctxt *ctxt,
case 7: /* fdivr */
emulate_fpu_insn_memsrc("fdivrs", src.val);
break;
- default:
- goto cannot_emulate;
}
}
break;
case 7: /* fidivr m32i */
emulate_fpu_insn_memsrc("fidivrl", src.val);
break;
- default:
- goto cannot_emulate;
}
}
break;
case 7: /* fidivr m16i */
emulate_fpu_insn_memsrc("fidivrs", src.val);
break;
- default:
- goto cannot_emulate;
}
}
break;
dst.type = OP_MEM;
emulate_fpu_insn_memdst("fistpll", dst.val);
break;
- default:
- goto cannot_emulate;
}
}
break;
}
break;
}
- default:
- goto cannot_emulate;
}
break;
goto push;
case 7:
generate_exception_if(1, EXC_UD, -1);
- default:
- goto cannot_emulate;
}
break;
+
+ default:
+ internal_error("primary", b, ctxt->regs);
+ goto cannot_emulate;
}
writeback:
break;
}
break;
+
+ default:
+ internal_error("secondary", b, ctxt->regs);
+ goto cannot_emulate;
}
goto writeback;